package py.edu.ucom.cadira.log;

import java.io.*;
import java.util.StringTokenizer;

import py.edu.ucom.cadira.game.event.GameEvent;
import py.edu.ucom.cadira.game.war.GameApplicationException;
import py.edu.ucom.cadira.game.war.GameListener;
import py.edu.ucom.cadira.game.war.Movement;
import py.edu.ucom.cadira.game.war.Square;
import py.edu.ucom.cadira.game.war.Tab;


/**
 *Clase para registrar los sucesos
 * @author Largonet
 */
public class logger implements GameListener
{

    String logFileName = "Waterloo.log";
    File fichero = new File(logFileName);
    FileReader fReader;
    FileWriter fWriter;
    String[] tipoLog = {"INFO", "WARNING", "SEVERE", "TEST"};
    String prueba;
    int nroLog = 0;
    PrintWriter salida;
    BufferedReader entrada;

    /**
     * Constructor de la clase. Cuando se instancia ya crea el archivo
     * @throws java.io.IOException
     * @throws py.edu.ucom.cadira.game.war.war.GameApplicationException 
     */
    public logger () throws IOException, GameApplicationException
    {

        try {
            fWriter = new FileWriter(fichero);
            // A partir del objeto File creamos el fichero físicamente
            //  fichero.createNewFile();
            System.out.println("El fichero se ha creado correctamente");
            createBuffer();
            System.out.println("El buffer se ha creado correctamente");
        } catch (IOException ioe) {
            System.out.println("No ha podido ser creado el fichero");
            ioe.printStackTrace();
        }
    }

    /**
     * Lee de un archivo lo registrado y pasa al WarGame para que grafique
     * Retorna un Movement (una ficha, dos casillas)
     * @return Retorna un objeto de tipo WaterlooLog con un movimiento y un int indicando si
     * fue waterloo el movimiento (1) o un simple movimiento (0)
     * @throws java.io.FileNotFoundException
     * @throws java.io.IOException
     */
    public MovimientoLog logLoad (
            ) throws FileNotFoundException, IOException
    {
        StringTokenizer token;
        String s;
        Movement mov = new Movement();
        Square casOrigen = new Square();
        Square casDestino = new Square();
        @SuppressWarnings("unused") 
        int nroRegLog, waterlooLog = 0;
        try {
            fReader = new FileReader(fichero);
            entrada = new BufferedReader(fReader);

            while ((s = entrada.readLine()) != null) {
                System.out.println(s);
                token = new StringTokenizer(s, "~");
                while (token.hasMoreTokens()) {
                    nroRegLog = Integer.parseInt(token.nextToken());
                    Tab fic = new Tab(Integer.parseInt(token.nextToken()), Integer.parseInt(token.nextToken()));
                    casOrigen.setTab(fic);
                    casOrigen.setPosX(Integer.parseInt(token.nextToken()));
                    casOrigen.setPosY(Integer.parseInt(token.nextToken()));
                    casDestino.setPosX(Integer.parseInt(token.nextToken()));
                    casDestino.setPosY(Integer.parseInt(token.nextToken()));
                    waterlooLog = (Integer.parseInt(token.nextToken()));
                    mov.setOrigen(casOrigen);
                    mov.setDestino(casDestino);
                }
            }
        } catch (java.io.FileNotFoundException fnfex) {
            System.out.println("No se encontro el archivo: " + fnfex.toString());
        } catch (IOException ioEx){
            System.out.println("Se presento el error al leer el archivo de log: " + ioEx.toString());        
        }
        MovimientoLog movLog = new MovimientoLog(mov, waterlooLog);
        return movLog;
    }

    /**
     * Metodo para la escritura de los registros dentro del arhivo
     * @param mov 
     * Clase Movement
     * @param waterloo 
     * 1 en caso de que el movimiento termine en waterloo y
     * 0 en caso de que sea un movimiento comun
     * @throws java.lang.Exception
     */
    public void logWrite (Movement mov, int waterloo) throws Exception
    {
        String logReg;
        logReg = nroLog + "~" 
                + mov.getDestino().getTab().getColor() + "~" 
                + mov.getOrigen().getTab().getValor() + "~" 
                + mov.getOrigen().getPosX() + "~" 
                + mov.getOrigen().getPosY() + "~" 
                + mov.getDestino().getPosX() + "~"
                + mov.getDestino().getPosY() + "~"
                + waterloo;
        salida.println(logReg);
        System.out.println(logReg);
        nroLog++;
        salida.flush();
    }

    private void createBuffer ()
    {
        BufferedWriter bw = new BufferedWriter(fWriter);
        salida = new PrintWriter(bw);
    }

    public void eventHappened(GameEvent event) {
        // TODO Auto-generated method stub
        
    }
}
